#ifndef GROUPS_H
#define GROUPS_H
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<string.h>
#include<arpa/inet.h>

#include "user.h"
#include "drawing.h"
#include "server_msg.h"

#define maxGroup 10
#define maxUser 10
#define maxName 20

/*
*       Structure stoquant la liste des cliénts et la zone de dessin
*/
struct groups
{
	char name[maxName]; // Le nom du groupe
    	int nUser;	// Nombre d'utilisateur dans le groupe
	struct user master; //Chef de groupe
	struct user list[maxUser]; // Liste des utilisateurs
    	struct drawing device;	// Zone de dessin du groupe
	struct server_msg msg;
};

struct list_groups
{
	int nGroup; //Le nombre de groupe
	struct groups list[maxGroup]; // Liste des groupes
	struct server_msg msg;
};

/*
*	Fonction à faire:
*	Ajout d'un client dans le tableau des utilisateurs:
*	Suppression d'un client
*	Créer un groupe en lui donnant un numéro de port, un identifiant du 
*	groupe, une liste vide de client et une zone graphique par défault
*	+ l'ajouter dans la liste des groupes.
*	Suppression de groupe et enlever le groupe de la liste
*	
*	
*/

/* Fonctions */

	/* Fonctions pour la structure list_groups */
	void createList(struct list_groups *list, struct server_msg msg);//creer une liste de groupe par defaut 
	int addGroup(struct list_groups *list, struct groups newGroupe);//returne 1 si newGroup a corectement etait ajouter dans la list, 0 sinon
	int rmGroup(struct list_groups *list,char *name);//returne la postion ou se trouve oldGroup s'il a corectement etait supprime de la list, -1 sinon
	void cleanListGroup(struct list_groups *list);//vide la liste de groupe
	struct groups* selectGroup(struct list_groups *list, char* name);//renvoie le groupe dont le nom est donne en parametre


	/* Fonctions pour la structure groups */
	void createGroup(struct groups *newGroup, char* name, struct user* master, struct server_msg msg);//creer un groupe avec un nom et son maitre, les autres parametres sont par defaut
	int addUser(struct groups *grp, struct user newUser);//returne 1 si newUser a corectement etait ajouter dans la list, 0 sinon
	int rmUser(struct groups *grp, struct user oldUser);//returne la position ou se trouve oldUser s'il a corectement etait supprimer de la list, -1 sinon
	void cleanListUser(struct groups *grp);//vide la liste d'utilisateur
	struct user* selectUserBySD(struct groups *grp, int sd);//renvoie le groupe'utilisateur dont l'identifiant est donne en parametre
	struct user* selectUserByName(struct groups *grp, char *n);

	void printUsers(struct groups grp, struct server_msg msg);
#endif
